/**
**Prerequisitos:
**Tener la Base de Datos AdventureWorks2012
**/

USE AdventureWorks2012
GO

/**
**Realizar una actualización de precios de Production.Product con el siguiente criterio
**	Productos con ListPrice < 100 $ incrementar en 15%
**	Productos con ListPrice > 100 $ incrementar en un 10%
**	No olvidar registrar el cambio en la Historico de precios ( tabla ProductListPriceHistory )
**	Utilizar un Cursor para esta pregunta.
**	Utilizar Manejo de Excepciones, en caso de error mostrar el mismo pero el proceso no debería parar, es decir si hay error en una operación de todos modos debe continuar los siguientes
**	Los resultados de las modificaciones (con OUTPUT) insertar en una tabla temporal con el Nombre del Producto, el precio anterior, el monto del incremento y el monto total nuevo.
**/

DECLARE @temp1 table (Id int identity (1,1)
					, NombreProducto varchar(100)
					, PrecioAnterior decimal(15,2)
					, Incremento decimal(15,2)
					, PrecioNuevo decimal(15,2))

DECLARE @id bigint
DECLARE @price decimal(15,2)
DECLARE @cprice decimal(15,2)
DECLARE @nprice decimal(15,2)

DECLARE Table_Crawler CURSOR FOR Select ProductID, ListPrice from Production.Product

OPEN Table_Crawler

FETCH NEXT FROM Table_Crawler into @id, @price

WHILE @@FETCH_STATUS=0
	BEGIN

		BEGIN TRY
			SELECT @nprice=(CASE WHEN @price>100 THEN @price*1.15 ELSE @price*1.10 END)
				,@cprice=(CASE WHEN @price>100 THEN @price*0.15 ELSE @price*0.10 END)
			UPDATE Production.Product SET ListPrice=@nprice 
				OUTPUT inserted.Name, @price, @cprice, @nprice
				INTO @temp1(NombreProducto,PrecioAnterior,Incremento,PrecioNuevo)
			WHERE ProductID=@id
			INSERT INTO Production.ProductListPriceHistory (ProductID,StartDate,EndDate,ListPrice,ModifiedDate)
			VALUES (@id,GETDATE(),DATEADD(year,1,GETDATE()),@nprice,GETDATE())

		END TRY
		BEGIN CATCH
			print(ERROR_MESSAGE())
		END CATCH
		FETCH NEXT FROM Table_Crawler into @id, @price
	END
CLOSE Table_Crawler

DEALLOCATE Table_Crawler 

SELECT * from @temp1

/**
**Crear una tabla Temporal con la serie Fibonacci hasta 30000 (como tope, no 30000 tuplas) una vez obtenido los Nros utilizarlos como si fueran Ids y esos igualando con el BusinessEntityId (Person.Person) Copiarlos a la DB Northwind ( a la tabla que corresponda) en Caso no existir insertar el valor, y en caso de si existir actualizar los datos.
**Utilizar Merge para Unificar los datos
**Los resultados de actualización o inserción Registrar en una tabla nueva creada de log(id identity, DatosAnteriores, NuevosDatos, OperacionRealizada, fechaDeActualizacion)
**/

USE NORTHWND
GO
SET IDENTITY_INSERT NORTHWND.dbo.Employees ON

USE AdventureWorks2012
GO

IF EXISTS (SELECT * FROM sys.tables WHERE Name='log')
	DROP  TABLE [log]
GO

CREATE TABLE [log](
	Id int Identity(1,1),
	DatosAnteriores varchar(100),
	DatosNuevos varchar(200),
	Operacion varchar(100),
	Fecha DateTime,
)

DECLARE @temp2 table (Id bigint)

DECLARE @fs bigint
DECLARE @ft bigint
DECLARE @fn bigint
SELECT @fs=1,@fn=1,@ft=1
INSERT INTO @temp2 (Id) VALUES (@fs)

WHILE @fn<30000
	BEGIN
		INSERT INTO @temp2 (Id) VALUES (@fn)
		SET @ft=@fn
		SET @fn=@fn+@fs
		SET @fs=@ft
	END

MERGE INTO NORTHWND.dbo.Employees as tgt
USING(
	SELECT DISTINCT(t.Id),LastName,FirstName,Title as TitleOfCourtesy
		FROM @temp2 t
		JOIN Person.Person p ON p.BusinessEntityId=t.Id
) as src(Id,LastName,FirstName,TitleOfCourtesy)
ON (src.Id=tgt.EmployeeID)
WHEN Matched 
	THEN UPDATE SET tgt.FirstName=src.FirstName,tgt.LastName=src.LastName
WHEN not Matched 
	THEN INSERT(EmployeeID,FirstName,LastName,TitleOfCourtesy) 
		VALUES (src.Id,src.LastName,src.FirstName,src.TitleOfCourtesy)
OUTPUT ISNULL(CONVERT(nvarchar,deleted.EmployeeID),'NEW')+' '
		+ISNULL(deleted.TitleOfCourtesy,'null')+' '
		+ISNULL(deleted.FirstName,'null')+' '
		+ISNULL(deleted.LastName,'null')
		,CONVERT(nvarchar,inserted.EmployeeID)+' '
		+ISNULL(inserted.TitleOfCourtesy,'null')+' '
		+ISNULL(inserted.FirstName,'null')+' '
		+ISNULL(inserted.LastName,'null')
		,$action
		,GETDATE() 
	INTO [log](DatosAnteriores,DatosNuevos,Operacion,Fecha)
;
select * from[log]
USE NORTHWND
GO
SET IDENTITY_INSERT NORTHWND.dbo.Employees OFF

USE AdventureWorks2012
GO